/**
 * Promise.all()
 * Promise.all方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
 * 
 * 包装的promise实例都resolved了它就resolved
 * 有一个rejected，它就rejected
 * 如果容器中的实例有自己的catch，则不会触发all的catch
*/

/**
 * Promise.race()
 * 和all类似，只是它是有一个实例率先改变状态了，它的状态就改变了。
*/

/**
 * Promise.resolve()
 * 返回一个resolved状态的Promise对象
 * 可以传入一个参数，作为resolve的值
*/

/**
 * Promise.reject()
 * 返回一个rejected状态的Promise对象
 * 可以传入一个参数，作为reject的原因
*/

/**
 * Promise.prototype.then()
 * 为Promise实例添加状态改变时的回调函数
 * then方法返回一个新的Promise实例，可以链式调用
*/

/**
 * Promise.prototype.catch()
 * 用于指定发生错误时的回调函数
 * catch方法返回一个新的Promise实例，可以链式调用
*/

/**
 * Promise.prototype.finally()
 * 用于指定不管Promise对象最后状态如何，都会执行的操作
 * finally方法返回一个新的Promise实例，可以链式调用
*/
// Promise.all示例
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]

// Promise.race示例
const promise4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise5 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise4, promise5]).then((value) => {
  console.log(value);
});
// expected output: "two"

// Promise.resolve示例
const promise6 = Promise.resolve(123);
promise6.then((value) => {
  console.log(value);
});
// expected output: 123

// Promise.reject示例
const promise7 = Promise.reject(new Error('something went wrong'));
promise7.catch((error) => {
  console.error(error);
});
// expected output: Error: something went wrong

// Promise.prototype.then示例
const promise8 = Promise.resolve(456);
promise8.then((value) => {
  console.log(value);
  return value + 1;
}).then((value) => {
  console.log(value);
});
// expected output: 456, 457

// Promise.prototype.catch示例
const promise9 = Promise.reject(new Error('something went wrong'));
promise9.catch((error) => {
  console.error(error);
  return 'recovered';
}).then((value) => {
  console.log(value);
});
// expected output: recovered

// Promise.prototype.finally示例
const promise10 = Promise.resolve(789);
promise10.finally(() => {
  console.log('finally');
}).then((value) => {
  console.log(value);
});
// expected output: 789, finally
